/**
 *	@file	bonguri.h
 *	@brief	ボングリセーブデータ
 *	@author	Miyuki Iwasawa
 *	@date	08.09.02
 */

#ifndef __H_BONGURI_H__
#define __H_BONGURI_H__

#include "bonguri_def.h"
#include "system/buflen.h"
#include "savedata/mystatus.h"

//------------------------------------------------------------
/**
 * @brief ボングリアセーブデータブロック管理構造への不完全型ポインタ
 *
 * 中身は見えないけどポインタ経由で参照はできる
 */
//------------------------------------------------------------
typedef struct _BONGURI_SAVE BONGURI_SAVE;


///ジュースの味取得用
typedef union _BONGJUICE_FPRM{
	struct{
		u16	flavor:4;
		u16	rank:4;
		u16	level:8;
	};
	u16	param;
}BONGJUICE_FPRM;

typedef struct _BONGJUICE_FLAVOR
{
	union{
		struct{
		BONGJUICE_FPRM	main;
		BONGJUICE_FPRM	sub;
		BONGJUICE_FPRM	hide;
		};
		BONGJUICE_FPRM	tbl[3];
	};
	u8	order[BONG_FTYPE_MAX];
	u8	min_ct;		//もっとも味値の低い味の数
	u8	ct;	///<味値を持つパラメータ数
}BONGJUICE_FLAVOR;

typedef struct _BONG_JUICE{
 u16	popurar;	//人気値
 u8		mild;	///<マイルド
 union{
	 struct{
		u8 hot;		///<辛い
		u8 sour;	///<すっぱい
		u8 astr;	///<渋い
		u8 bitter;	///<苦い
		u8 sweet;	///<甘い
	 };
	u8	param[5];
 };
}BONG_JUICE;

///ボングリジュース通信型
typedef struct _BONG_JUICE_COMM{
	u32	tr_id;	//<撮影者のトレーナーID
	u8	tr_sex;
	u8	region;
	u8	version;
	STRCODE name[PERSON_NAME_SIZE+EOM_SIZE];

	BONG_JUICE	juice;	///<ジュースパラメータ
}BONG_JUICE_COMM;

/**
 *	@brief	ボングリデータサイズ取得
 */
extern int BonguriSave_GetWorkSize(void);

/**
 *	@brief	ボングリジュース通信データ型サイズ取得(１人分)
 */
extern int BonguriSave_GetBongJuiceCommWorkSize(void);

/**
 *	@brief	ボングリセーブデータブロックへのポインタ取得
 */
extern BONGURI_SAVE* SaveData_GetBonguriSave(SAVEDATA* sv);

/**
 *	@brief	ボングリセーブデータクリア
 */
extern void BonguriSave_Clear(BONGURI_SAVE* sv);

/**
 *	@brief	ボングリジュースデータ　オールクリア
 */
extern void BonguriSave_CommJuiceAllClear(BONGURI_SAVE* sv);

/**
 *	@brief	ボングリセーブデータ初期化
 */
extern void BonguriSave_Init(BONGURI_SAVE* sv);

/**
 *	@brief	ボングリジュースデータ初期化
 */
extern void BongJuice_Clear(BONG_JUICE* juice);

/**
 *	@brief	ボングリを追加する
 *
 *	@param	col	ボングリのカラー
 *	@param	add_num	追加数
 *
 *	@return	追加後の総数
 */
extern u8 BonguriSave_BonguriAdd(BONGURI_SAVE* sv,BONG_COLOR col,u8 add_num);

/**
 *	@brief	ボングリを消費する
 *
 *	@param	col	ボングリのカラー
 *	@param	sub_num	消費数
 *
 *	@return	指定数を消費後の残り数
 *
 *	＊指定数を消費できなかった場合、なにもせずにかえります
 */
extern u8 BonguriSave_BonguriSub(BONGURI_SAVE* sv,BONG_COLOR col,u8 sub_num);

/**
 *	@brief	ボングリの手持ち数を取得
 */
extern u8 BonguriSave_GetBonguriNum(BONGURI_SAVE* sv,BONG_COLOR col);

/**
 *	@brief	ガンテツにボングリを預ける(ボングリ消費処理込み)
 */
extern void BonguriSave_KeepBonguri(BONGURI_SAVE* sv,BONG_COLOR col,u8 set_num);

/**
 *	@brief	ガンテツに預けているボングリの個数を取得する
 */
extern u8 BonguriSave_GetKeepBonguriNum(BONGURI_SAVE* sv);

/*
 *	@brief　ガンテツに預けたボングリの種類から、もらえるアイテムナンバーを返す
 */
extern u16 BonguriSave_ExchangeKeepBonguri(BONGURI_SAVE* sv);

/**
 *	@brief	ボングリの手持ち数をセット
 */
extern u8 BonguriSave_SetBonguriNum(BONGURI_SAVE* sv,BONG_COLOR col,u8 num);

/*
 *	@brief	起動メッセージフラグをセット
 */
extern void BonguriSave_SetStartupFlag(BONGURI_SAVE* sv,BONG_STARTUP flag);

/*
 *	@brief	起動メッセージフラグを取得
 */
extern BONG_STARTUP BonguriSave_GetStartupFlag(BONGURI_SAVE* sv);

/**
 *	@brief	ポットにセットされたボングリの数を取得する
 */
extern u8	BonguriSave_GetStockNum(BONGURI_SAVE* sv);

/**
 *	@brief	ポットにボングリをセットする(ボングリ消費処理込み)
 *
 *	@param	col	セットするボングリカラー
 *	@param	walk_ct	現在の歩数カウント
 *
 *	@retval	TRUE セットできた
 *	@retval	FALSE セットできなかった
 */
extern BOOL BonguriSave_SetStock(BONGURI_SAVE* sv,BONG_COLOR col,u32 walk_ct);

/**
 *	@brief	ポットの状態を取得
 */
extern int BonguriSave_GetPotState(BONGURI_SAVE* sv);

/**
 *	@brief	日付変更でジュースのまろやかさがアップ
 */
extern void BonguriSave_JuiceDayUpdate(BONGURI_SAVE* sv,s32 diff_days);

/**
 *	@brief	ジュースの残量取得
 */
extern u8 BonguriSave_GetJuiceRestCount(BONGURI_SAVE* sv);

/**
 *	@brief	ボングリジュースのパラメータを取得
 */
extern BOOL BonguriSave_GetJuiceParam(BONGURI_SAVE* sv,BONG_JUICE_ID id,BONG_JUICE* juice);

/**
 *	@brief	ジュースのパラメータが有効かどうか取得
 */
extern BOOL BongJuice_IsEnable(BONG_JUICE* juice);

/**
 *	@brief	ジュースの味レベルを取得
 */
extern u8 BongJuice_GetTasteLevel(BONG_JUICE* juice);

/**
 *	@brief	ジュースの各味レベルをゲット
 */
extern u8 BonguriSave_GetFlavorLevel(BONGURI_SAVE* sv,BONG_FTYPE ftype);
/**
 *	@brief	ジュースの残量セット
 */
extern void BonguriSave_SetJuiceRestCount(BONGURI_SAVE* sv,u8 rest);

/**
 *	@brief	ジュースの各味レベルをセット
 */
extern void BonguriSave_SetFlavorLevel(BONGURI_SAVE* sv,BONG_FTYPE ftype,u8 taste);

/**
 *	@brief	ジュースのマイルドさを取得
 */
extern u8 BonguriSave_GetMildLevel(BONGURI_SAVE* sv);

/**
 *	@brief	ジュースのマイルドさをセット
 */
extern void BonguriSave_SetMildLevel(BONGURI_SAVE* sv,u8 mild);

/**
 *	@brief	ジュースの味値詳細を取得
 */
extern void BongJuice_GetFlavorParam(BONG_JUICE* juice,BONGJUICE_FLAVOR* pbf);

/**
 *	@brief	ジュースの色を返す
 */
extern BONG_FTYPE BongJuice_GetJuiceColor(BONG_JUICE* juice);

/**
 *	@brief	ボンジュースデータ ジュースの名前IDを取得
 */
extern BONGJUICE_NAME_ID BongJuice_GetNameID(BONG_JUICE* juice);

/**
 *	@brief	ジュースを消費する
 */
extern int BonguriSave_UseJuice(BONGURI_SAVE* sv);

/**
 *	@brief	ジュースの状態を歩数でアップデートする
 *
 *	@param	now_walk_ct	現在の歩数
 */
extern void BonguriSave_JuiceStateUpdate(BONGURI_SAVE* sv,u32 now_walk_ct);

/*
 *	@brief　ボンジュース送信データを生成
 *
 *	@param	sv	ボングリセーブ
 *	@param	my	MYSTATUS
 *	@param	fun_num	ポケスロンの人気値
 *
 *	@li	プレイヤーのジュースパラメータをAllocしたメモリに格納して返します
 *	@li	要らなくなったら呼び出し側が責任もって解放してください
 */
extern void* BongSave_BongJuiceCommDataAlloc(BONGURI_SAVE* sv,MYSTATUS* my,u32 fun_num,int heapID);

/**
 *	@brief	ボンジュースデータ受信
 *
 *	@param	sv	ボングリセーブデータへのポインタ
 *	@param	buf	受信データバッファへのポインタ(BONG_JUICE_COMM構造体の人数分の配列になるハズ)
 *	@param	num	有効データ数(通信クライアントの数)
 *	@param	net_id	自分の通信ID
 */
extern void BongSave_BongJuiceCommDataSet(BONGURI_SAVE* sv,void* buf,int num,int net_id);

/**
 *	@brief	ボンジュース通信データ 名前を取得
 *
 *	自分の名前は取れません
 */
extern STRBUF* BongSave_BongJuiceUserNameAlloc(BONGURI_SAVE* sv,BONG_JUICE_ID juice_id,int heapID);

/**
 *	@brief	ボンジュースデータ ジュース名を取得
 */
extern STRBUF* BongSave_BongJuiceNameAlloc(BONGURI_SAVE* sv,BONG_JUICE_ID juice_id,int heapID);

#ifdef PM_DEBUG
extern void BongJuiceDebug_GetWalkCount(BONGURI_SAVE* sv,u32* pc);
/**
 *	@brief	デバッグ用　ストックされたぼんぐりを配列に返す
 *
 *	u8[5]のサイズを持つバッファを渡す必要があります
 */
extern u8 BongJuiceDebug_GetStockBonguri(BONGURI_SAVE* sv,u8* bong);
#endif	//PM_DEBUG


#endif	//__H_BONGURI_H__
